#include <stdio.h>

/*描述
        KiKi有一个矩阵，他想知道转置后的矩阵（将矩阵的行列互换得到的新矩阵称为转置矩阵），请编程帮他解答。

输入描述：
第一行包含两个整数n和m，表示一个矩阵包含n行m列，用空格分隔。 (1≤n≤10,1≤m≤10)

从2到n+1行，每行输入m个整数（范围-231~231-1），用空格分隔，共输入n*m个数，表示第一个矩阵中的元素。

输出描述：
输出m行n列，为矩阵转置后的结果。每个数后面有一个空格。*/
//void matrix(int a ,int b){
//    int arr[a][b];
//    int arr_1[b][a];
//    for(int i = 0;i < a;i++){
//        for(int j = 0;j < b;j++){
//            scanf("%d",&arr[i][j]);
//        }
//    }
//    for(int i = 0;i < b;i++){
//        for(int j = 0;j < a;j++){
//            arr_1[i][j] = arr[j][i];
//        }
//    }
//    for(int i = 0;i < b;i++){
//        for(int j = 0;j < a;j++){
//            printf("%d ",arr_1[i][j]);
//        }
//        printf("\n");
//    }
//
//}
//
//int main() {
//
//    int a,b;
//    scanf("%d %d",&a,&b);
//    matrix(a,b);
//
//    return 0;
//}


/*
 描述
输入两个升序排列的序列，将两个序列合并为一个有序序列并输出。

数据范围：1≤n,m≤1000
1≤n,m≤1000  ， 序列中的值满足0≤val≤30000
输入描述：
输入包含三行，

第一行包含两个正整数n, m，用空格分隔。n表示第二行第一个升序序列中数字的个数，m表示第三行第二个升序序列中数字的个数。

第二行包含n个整数，用空格分隔。

第三行包含m个整数，用空格分隔。
输出描述：
输出为一行，输出长度为n+m的升序序列，即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。
 */

//void supplement(int arr[],int len){
//    for(int i = 0;i < len;i++){
//        scanf("%d",&arr[i]);
//    }
//}
//
//int* merge_1(int arr_1[],int len_1,int arr_2[],int len_2,int arr_sum[]){
//    int len = 0;
//    for(int i = 0;i < len_1;i++){
//        arr_sum[len++] = arr_1[i];
//    }
//    for(int i = 0;i < len_2;i++){
//        arr_sum[len++] = arr_2[i];
//    }
//    return arr_sum;
//}
//
////归并排序
//// 合并两个子数组函数
//void merge(int arr[], int l, int m, int r) {
//    int i, j, k;
//    int n1 = m - l + 1;
//    int n2 = r - m;
//
//    // 创建临时数组
//    int L[n1], R[n2];
//
//    // 复制数据到临时数组
//    for (i = 0; i < n1; i++)
//        L[i] = arr[l + i];
//    for (j = 0; j < n2; j++)
//        R[j] = arr[m + 1 + j];
//
//    // 合并临时数组回到原数组arr[l..r]
//    i = 0;
//    j = 0;
//    k = l;
//    while (i < n1 && j < n2) {
//        if (L[i] <= R[j]) {
//            arr[k] = L[i++];
//        } else {
//            arr[k] = R[j++];
//        }
//        k++;
//    }
//
//    // 复制L[]的剩余元素
//    while (i < n1) {
//        arr[k++] = L[i++];
//    }
//
//    // 复制R[]的剩余元素
//    while (j < n2) {
//        arr[k++] = R[j++];
//    }
//}
//
//// 主函数实现归并排序
//void mergeSort(int arr[], int l, int r) {
//    if (l < r) {
//        // 同样是分治法应用
//        int m = l + (r - l) / 2;
//
//        // 递归排序两半
//        mergeSort(arr, l, m);
//        mergeSort(arr, m + 1, r);
//
//        // 合并两半
//        merge(arr, l, m, r);
//    }
//}
//int main(){
//    int a,b;
//    scanf("%d %d", &a, &b);
//
//    int arr_1[a],arr_2[b],arr_sum[a+b];
//    supplement(arr_1,a);
//    supplement(arr_2,b);
//
//    merge_1(arr_1,a,arr_2,b,arr_sum);
//    mergeSort(arr_sum,0,a+b-1);
//    for (int i = 0; i <a+b ; i++) {
//        printf("%d ",arr_sum[i]);
//    }
//
//    return 0;
//}

//二分查找-函数实现
// arr 是查找的数组
//left 数组的左下标
//right 数组的右下标
//key 要查找的数字
//int bin_search(int arr[], int left, int right, int key){
//    while (left <= right){
//        int mid = left + (right-left)/2;
//        if(key == arr[mid]){
//            return mid;
//        }
//        else if(key < arr[mid]){
//            right = mid - 1;
//        }
//        else {
//            left = mid + 1;
//        }
//    }
//    return -1;
//}
//
//int main(){
//int arr[5] = {1,2,3,4,5,};
//int x = bin_search(arr,0,4,3);
//    printf("%d",x);
//
//    return 0;
//}

//实现一个函数，打印乘法口诀表，口诀表的行数和列数自己指定
//
//        如：输入9，输出9*9口诀表，输出12，输出12*12的乘法口诀表。

//void multiplicationTable(int a){
//
//    for (int i = 1; i <= a; i++) {
//        for (int j = 1; j <= a; j++) {
//            printf("%dx%d=%-2d ",j,i,i*j);
//            if(i == j){
//                break;
//            }
//        }
//        printf("\n");
//    }
//
//}
//
//int main(){
//    multiplicationTable(9);
//    return 0;
//}

/*创建一个整形数组，完成对数组的操作

实现函数init() 初始化数组为全0
实现print()  打印数组的每个元素
实现reverse()  函数完成数组元素的逆置。
要求：自己设计以上函数的参数，返回值。*/

void init(int arr[],int len){
    for(int i = 0;i < len;i++){
        arr[i] = 0;
    }
}
void print(int arr[],int len){
    for(int i = 0;i < len;i++){
        printf("%d ",arr[i]);
    }
}
void reverse(int arr[],int len){
    int start = 0;
    int end = len-1;
    while (start < end){
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = arr[temp];
        start++;
        end--;
    }
}

int main(){
    int arr[10];
    init(arr,10);
    print(arr,10);
    printf("\n-----------------------------------------\n");
    reverse(arr,10);
    print(arr,10);

    return 0;
}

